package com.sy.simpleegg.ui.dialog

import android.annotation.SuppressLint
import android.content.Context
import android.content.DialogInterface
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.LinearLayoutManager
import com.bumptech.glide.Glide
import com.sy.simpleegg.R
import com.sy.simpleegg.adapter.IconPayAdapter
import com.sy.simpleegg.bean.PayIconBean
import com.sy.simpleegg.databinding.DialogPaymentBinding
import com.sy.simpleegg.ext.countDown
import com.sy.simpleegg.ext.logFile
import com.sy.simpleegg.util.QRCodeUtil
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel


class PaymentDialog(
    private val title: String?,
    private val scantips: String?,
    private val backscanTips: String?,
    private val countDownTime: Int,
    private val k: String,
    private val payIconBean: PayIconBean,
    private var paymentDialogListener: PaymentDialogListener,
): DialogFragment() {

    private lateinit var binding: DialogPaymentBinding

    var timeDownScope: CoroutineScope? = null

    override fun onStart() {
        super.onStart()
//        dialog!!.window!!.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)

        val width = resources.getDimensionPixelSize(R.dimen.dialog_payment_width)
        val height = resources.getDimensionPixelSize(R.dimen.dialog_payment_height)
//        val marginBottom = resources.getDimensionPixelSize(R.dimen.dialog_good_detail_margin_bottom)

//        dialog!!.window!!.setLayout(width, height + marginBottom)
        dialog!!.window!!.setLayout(width, height)
        dialog!!.window!!.setGravity(Gravity.CENTER)
        dialog!!.setCanceledOnTouchOutside(false)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View? {
        binding = DialogPaymentBinding.inflate(inflater, container, false)
//        setStyle(STYLE_NO_TITLE, R.style.MyDialog)
//        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT))
//        dialog!!.window!!.setGravity(Gravity.BOTTOM)
        dialog!!.window!!.setBackgroundDrawableResource(R.color.transparent)
//        var wlp = dialog!!.window!!.attributes
//        wlp.gravity = Gravity.BOTTOM
//        wlp.width = WindowManager.LayoutParams.MATCH_PARENT
//        wlp.height = WindowManager.LayoutParams.MATCH_PARENT
//        dialog!!.window!!.attributes = wlp

        return binding.root
    }

    @SuppressLint("SetTextI18n")
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        try {
            binding.tvQrCodeTitle.text = title
            binding.tvPackageBackScanTips.text = backscanTips
            binding.tvScanTips.text = scantips
            binding.layoutClose.tvDismiss.text = "${countDownTime}S"

            binding.rvPayIcon.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)

            val icons = when (payIconBean.type){
                0 -> {
                    mutableListOf<Any>()
                }
                1 -> {
                    mutableListOf<Any>(R.mipmap.ic_ali, R.mipmap.ic_wechat)
                }
                2 -> {
                    payIconBean.src?.let {
                        mutableListOf<Any>(it)
                    }?: mutableListOf<Any>()
                }
                else -> mutableListOf<Any>()
            }


            binding.rvPayIcon.adapter = IconPayAdapter(requireContext(), icons)

            binding.layoutClose.tvClose.setOnClickListener {
                paymentDialogListener.back(k)
                dismissAllowingStateLoss()
            }
            binding.btnDismiss.setOnClickListener {
                paymentDialogListener.back(k)
                dismissAllowingStateLoss()
            }
        }catch (e: Exception){
            e.printStackTrace()
            logFile("初始化页面异常：${e.message}")
        }
    }

    override fun showNow(manager: FragmentManager, tag: String?) {
        super.showNow(manager, tag)
        startCountDown(countDownTime)
    }

    override fun show(manager: FragmentManager, tag: String?) {
        super.show(manager, tag)
        startCountDown(countDownTime)
    }

    override fun show(transaction: FragmentTransaction, tag: String?): Int {
        val result = super.show(transaction, tag)
        startCountDown(countDownTime)
        return result

    }

    override fun onDismiss(dialog: DialogInterface) {
        super.onDismiss(dialog)
        paymentDialogListener.dismiss()
    }

    /**
     * 刷新二维码
     * @param qrCode 二维码数据
     */
    fun refreshQrCode(qrCode: String){
        try {
            binding.pbQrCode.visibility = View.GONE
            Glide.with(binding.root)
                .load(QRCodeUtil.createQRCode(qrCode, 500, 500))
                .fitCenter()
                .into(binding.ivQrCode)
            binding.ivQrCode.visibility = View.VISIBLE
            startCountDown(countDownTime)
        }catch (e: Exception){
            e.printStackTrace()
            logFile("刷新二维码异常：${e.message}")
        }
    }

    @SuppressLint("SetTextI18n")
    private fun startCountDown(timeout: Int){
//        var timeDownScope: CoroutineScope? = null
        timeDownScope?.cancel()

        countDown(
            time = countDownTime,
            start = {
                timeDownScope = it
                logFile("开始倒计时")
            },
            end = {
                logFile("结束倒计时")
            },
            next = {
                binding.layoutClose.tvDismiss.text = "${it}S"
                if (it == 0){
                    dismissAllowingStateLoss()
                }
            })
    }

    interface PaymentDialogListener{
        fun dismiss()

        fun back(k: String)
    }

    fun dpToPx(context: Context, dp: Int): Int {
        val density = context.resources.displayMetrics.density
        return Math.round(dp * density)
    }
}